'use strict';
const log = require("@gsh-cli/log")
const colors = require('colors')

class Commander {
    constructor(argv) {
      // 检测argv的传参
      if(!argv) {
        log.error(colors.red('必须传argv参数！'))
      }
      // 检测argv的传参必须是数组格式
      if(!Array.isArray(argv)) {
        log.error(colors.red('argv参数必须是数组格式！'))
      }
      // 检测argv的传参不能为空数组
      if(argv.length < 1) {
        log.error(colors.red('argv参数不能为空数组！'))
      }
      this._argv = argv
      let chain = Promise.resolve()
      chain
      .then(() => {this.initArgs()})
      .then(() => this.init())
      .then(() => this.exec())
      .catch(err => {
        log.error(colors.red(err.message))
      })
    }

  /* 
  * @Description: 对传参做处理
  */     
  initArgs() {
    this._cmd = this._argv[this._argv.length - 1]
    this._argv = this._argv.slice(0, this._argv.length - 1)
  }

  /* 
  * @Description: Conmmander基类的init方法，用于保证子实例有init方法
  */     
  init() {
    // 检测必须调用子实例的init方法，否则就会向上查找调用的是基类的init
    throw Error('必须调用init方法')
  }

  /* 
  * @Description: Conmmander基类的exec方法，用于保证子实例有exec方法
  */ 
  exec() {
    // 检测必须调用子实例的exec方法，否则就会向上查找调用的是基类的exec
    throw Error('必须调用exec方法')
  }
    
}

module.exports = Commander;

